포인터 기초

이 노트는 C++ 포인터의 선언 형식, 크기와 타입 일치 같은 특징, 그리고 주소 연산자(&)·산술 연산·간접 연산자(*)·간접 멤버 연산자(->)를 정리한다. 포인터를 함수 인자로 넘기면 값이 복사되는 일반 변수와 달리 원본 값 자체를 함수 내부에서 바꿀 수 있다는 점이 핵심 특징으로 강조된다.

  1. 포인터 선언
  2. 포인터 특징
  3. 포인터 연산

포인터 선언

TYPE * [포인터 이름] = [주소값];

  • TYPE : int, double, class, 객체 등등…
  • 포인터 이름 : 원하는 이름 ( 대체로 pointer의 약자 “ptr”을 이용)
  • 주소값 : 포인터가 가리킬 값의 주소

포인터 특징

  • 포인터의 크기 : 4 Byte (32bit)  / 8 Byte (64bit)
    • 주소값의 크기가 64비트의 컴퓨터의 경우 8바이트를 차지함 
  • 포인터가 원하는 주소값의 Type과 일치해야함

int num = 10;
double *ptr = # // 불가능

  • 함수 인자로서 사용 가능
    • 함수 인자로 사용할경우 값을 복사해서 사용하는 것이 아닌, 원본값 그대로 사용

void Test(int *num)
{
    // 함수 바디
    num++;
}

int main()
{

    int n = 10;
    Test(&n);
    cout << n << endl; // n = 11

}

포인터 연산

  • 주소 연산자
    • ”&” : 해당 변수의 주소값을 나타낼 때 사용
    • ex) int num = 10;  
    • ( num 변수의 주소값 : &num )
  • 산술 연산자
    • 포인터에는 Type이 있기에 해당 크기 기준 “1”로 산정한다
    • ex) int *ptr  = & num; 
    • ( ptr + 1 => ptr을 현재위치에서 4바이트( == int) 크기만큼 이동한 포인터지점을 의미 )
  • 간접 연산자
    • ” * ” : 포인터가 가리키는 변수의 실제 값을 다룰 때 사용
    • ex)  int *ptr = #
    • ( *ptr = 30; // num에 저장되어있는 수가 30으로 변경된다)
  • 간접 멤버 연산자
    • ”->” : 구조체 특정 멤버 다룰 때 사용
    • 실제적으로, 어셈블리어 코드로 확인하면, 처음 지점에서 산술연산을 통해 해당 지점으로 움직인 것

struct StatInfo

    int _hp;
    int _star;
}

int main ()
{

    StatInfo *s;

    // 동일한 의미
   (*s)._star = 30;
    s->_hp = 20;
    // (1).  s = s + 1;
    // (2). (*s) = 20; 

}